<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="Gc6An" id="Gc6An"><span data-lake-id="u4cbddf15" id="u4cbddf15">典型回答</span></h1>
  <p data-lake-id="u5b217b09" id="u5b217b09"><span data-lake-id="ue74245a9" id="ue74245a9">Java 注解用于为 Java 代码提供元数据。作为元数据，注解不直接影响你的代码执行，但也有一些类型的注解实际上可以用于这一目的。Java 注解是从 Java5 开始添加到 Java 的。</span></p>
  <p data-lake-id="u99db5952" id="u99db5952"><span data-lake-id="ucd924e7f" id="ucd924e7f">Java的注解，可以说是一种标识，标识一个类或者一个字段，常常是和反射，AOP结合起来使用。中间件一般会定义注解，如果某些类或字段符合条件，就执行某些能力。</span></p>
  <h1 data-lake-id="GnBQK" id="GnBQK"><span data-lake-id="u1e532548" id="u1e532548">扩展知识</span></h1>
  <h2 data-lake-id="srN5F" id="srN5F"><span data-lake-id="u0eb275b9" id="u0eb275b9">什么是元注解</span></h2>
  <p data-lake-id="u7db1db89" id="u7db1db89"><span data-lake-id="u7b1448b3" id="u7b1448b3">说简单点，就是 定义其他注解的注解 。</span></p>
  <p data-lake-id="u0b5e965e" id="u0b5e965e"><span data-lake-id="ub41eabb9" id="ub41eabb9">比如Override这个注解，就不是一个元注解。而是通过元注解定义出来的。</span></p>
  <pre lang="java"><code>
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
</code></pre>
  <p data-lake-id="u8eaafe93" id="u8eaafe93"><span data-lake-id="u0713dd23" id="u0713dd23">这里面的@Target，@Retention就是元注解。</span></p>
  <p data-lake-id="u373e73c3" id="u373e73c3"><span data-lake-id="ua263c142" id="ua263c142">元注解有四个:@Target（表示该注解可以用于什么地方）、@Retention（表示在什么级别保存该注解信息）、@Documented（将此注解包含在javadoc中）、@Inherited（允许子类继承父类中的注解）。</span></p>
  <p data-lake-id="u2211f135" id="u2211f135"><span data-lake-id="u9338f456" id="u9338f456">​</span><br></p>
  <p data-lake-id="uf78bd3aa" id="uf78bd3aa"><span data-lake-id="ue4d345c9" id="ue4d345c9">一般@Target是被用的最多的。</span></p>
  <h3 data-lake-id="KKxBv" id="KKxBv"><span data-lake-id="u8c888e23" id="u8c888e23">@Retention</span></h3>
  <p data-lake-id="ue4bf4ed2" id="ue4bf4ed2"><br></p>
  <p data-lake-id="ufa5d3720" id="ufa5d3720"><span data-lake-id="ucf93f3d7" id="ucf93f3d7">指定被修饰的注解的生命周期，即注解在源代码、编译时还是运行时保留。它有三个可选的枚举值：SOURCE、CLASS和RUNTIME。默认为CLASS。</span></p>
  <p data-lake-id="u4dfcdfbc" id="u4dfcdfbc"><span data-lake-id="u28d5a705" id="u28d5a705">​</span><br></p>
  <pre lang="java"><code>
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface MyRuntimeAnnotation {
    // some elements and values
}

</code></pre>
  <p data-lake-id="u22f0bdb7" id="u22f0bdb7"><br></p>
  <h3 data-lake-id="wqCqi" id="wqCqi"><span data-lake-id="uc7e0d16e" id="uc7e0d16e">@Target</span></h3>
  <p data-lake-id="ufc051709" id="ufc051709"><span data-lake-id="ucbf2d63a" id="ucbf2d63a">指定被修饰的注解可以应用于的元素类型，如类、方法、字段等。这样可以限制注解的使用范围，避免错误使用。</span></p>
  <p data-lake-id="u802069f9" id="u802069f9"><span data-lake-id="ua54f5139" id="ua54f5139">​</span><br></p>
  <pre lang="java"><code>
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;

@Target({ElementType.TYPE, ElementType.METHOD})
public @interface MyTargetAnnotation {
    // some elements and values
}

</code></pre>
  <p data-lake-id="u871ebb6a" id="u871ebb6a"><span data-lake-id="u397847fa" id="u397847fa" class="lake-fontsize-12" style="color: rgb(55, 65, 81); background-color: rgb(247, 247, 248)">​</span><br></p>
  <h3 data-lake-id="AW1Bc" id="AW1Bc"><span data-lake-id="uc6919bf9" id="uc6919bf9">@Documented</span></h3>
  <p data-lake-id="u42924a30" id="u42924a30"><br></p>
  <p data-lake-id="u799f49c0" id="u799f49c0"><span data-lake-id="u63034ac1" id="u63034ac1">用于指示注解是否会出现在生成的Java文档中。如果一个注解被@Documented元注解修饰，则该注解的信息会出现在API文档中，方便开发者查阅。</span></p>
  <p data-lake-id="u8b88c8e4" id="u8b88c8e4"><span data-lake-id="u4a98d463" id="u4a98d463" class="lake-fontsize-12" style="color: rgb(55, 65, 81); background-color: rgb(247, 247, 248)">​</span><br></p>
  <pre lang="java"><code>
import java.lang.annotation.Documented;

@Documented
public @interface MyDocumentedAnnotation {
    // some elements and values
}

</code></pre>
  <p data-lake-id="u0c23b5f2" id="u0c23b5f2"><br></p>
  <h3 data-lake-id="S8ghM" id="S8ghM"><span data-lake-id="ub557bf4f" id="ub557bf4f">@Inherited</span></h3>
  <p data-lake-id="u19c51634" id="u19c51634"><br></p>
  <p data-lake-id="u8891b70d" id="u8891b70d"><span data-lake-id="ucb159d5d" id="ucb159d5d">指示被该注解修饰的注解是否可以被继承。默认情况下，注解不会被继承，即子类不会继承父类的注解。但如果将一个注解用@Inherited修饰，那么它就可以被子类继承。</span></p>
  <p data-lake-id="ue5d638c5" id="ue5d638c5"><span data-lake-id="u5b3196da" id="u5b3196da" class="lake-fontsize-12" style="color: rgb(55, 65, 81); background-color: rgb(247, 247, 248)">​</span><br></p>
  <pre lang="java"><code>
import java.lang.annotation.Inherited;

@Inherited
public @interface MyInheritedAnnotation {
    // some elements and values
}

</code></pre>
  <p data-lake-id="udcccc433" id="udcccc433"><br></p>
 </body>
</html>